package cn.com.bluemoon.daps.standard.service;

import cn.com.bluemoon.daps.common.mp.IBmService;
import cn.com.bluemoon.daps.standard.entity.DapSystemSequenceGenerate;
import org.springframework.lang.Nullable;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotNull;
import java.util.Optional;

/**
 * <p>
 * 编码规则表，如：指标编码规则，自动生成，规则：
 * ZB_MM_NNNNNN
 * ZB：“指标”的标识；
 * MM：代码所属于主题的代码；
 * NNNNNN：6位数字序列号，从000001开始排序；
 * 举例：ZB_ZF_000001。 服务类
 * </p>
 *
 * @author admin
 * @since 2020-08-18
 */
@Validated
public interface DapSystemSequenceGenerateService extends IBmService<DapSystemSequenceGenerate> {

    /**
     * 根据实体类属性生成标准编码
     *
     * @param generate
     * @param upperCase
     * @param splitLine
     * @return
     */
    Optional<String> generateByModel(DapSystemSequenceGenerate generate, Boolean upperCase,
                                     @Nullable String splitLine);

    /**
     *
     * @param type 编码类别非空
     * @param topicCode 指定对应的主题编码不可为空
     * @param upperCase  序列号生成是否大写 默认true
     * @param serialLength 序列号长度 默认{@link DapSystemSequenceGenerateServiceImpl#MY_SERIAL_LENGTH_DEFAULT}
     * @param serialInitValue 默认{@link DapSystemSequenceGenerateServiceImpl#MY_SERIAL_INIT_DEFAULT}
     * @param splitLine 默认{@link DapSystemSequenceGenerateServiceImpl#MY_SERIAL_SPLIT_LINE_DEFAULT}
     * @return 序列号
     */
    String getSeqByTypeAndTopicCodeAndSerial(@NotNull(message = "编码类别非空") String type,
                                             @NotNull(message = "指定对应的主题编码不可为空") String topicCode,
                                             @Nullable Boolean upperCase,
                                             @Nullable Integer serialLength,
                                             @Nullable Integer serialInitValue,
                                             @Nullable String splitLine);

    /**
     *  根据指定的type和主题id获取主题编码， 生成指标编码
     *
     * @param type
     * @param topicId
     * @return
     */
    String getSeqByTypeAndTopicId(@NotNull(message = "编码类别非空") String type, @NotNull(message = "指定对应的主题id不可为空") String topicId);

    /**
     * 直接根据指定的type和主题编码 生成指标编码
     *
     * @param type
     * @param topicCode
     * @return
     */
    String getSeqByTypeAndTopicCode(@NotNull(message = "编码类别不可为空") String type, @NotNull(message = "对应的主题编码不可为空") String topicCode);

}
